home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Directorytools / Dux5 / DUX5.c < prev    next >
C/C++ Source or Header  |  1996-09-26  |  61KB  |  2,121 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <intuition/intuition.h>
  4. #include <graphics/gfxbase.h>
  5. #include <libraries/dosextens.h>
  6. #define ESC         0x1b
  7. #define FBSIZE  (long)(sizeof (struct FileInfoBlock))
  8. #define MAXFILE      100
  9. #define MAXFNAME   9
  10. #define MAXCHAR      30
  11. #define MAXCD      255
  12. #define SLIDE_GADGET   0
  13. #define DSLIDE_GADGET   1
  14. #define ERR_GADGET   2
  15. #define EXECUTE_GADGET   3
  16. #define CURDIR_GADGET   4
  17. #define CPDIR_GADGET   5
  18. #define DF0_GADGET   6
  19. #define DF1_GADGET   7
  20. #define DF2_GADGET   8
  21. #define RAM_GADGET   9
  22. #define ALL_GADGET   10
  23. #define DH0_GADGET   11
  24. #define DH1_GADGET   12
  25. #define DH2_GADGET   13
  26. #define SWAP_GADGET   14
  27. #define CLEAR_GADGET   15
  28. #define DELETE_GADGET   16
  29. #define EDIT_GADGET   17
  30. #define FORMAT_GADGET   18
  31. #define DSKCPY_GADGET   19
  32. #define COPYALL_GADGET   20
  33. #define DELDIR_GADGET   21
  34. #define GETDIR_GADGET   22
  35. #define MAKEDIR_GADGET  23
  36. #define PARENT_GADGET   24
  37. #define ROOT_GADGET   25
  38. #define TYPE_GADGET   26
  39. #define HTYPE_GADGET   27
  40. #define PRINT_GADGET    28
  41. #define EXEC_GADGET   29
  42. #define RUN_GADGET   30
  43. #define COPY_GADGET   31
  44. #define MOVDEL_GADGET   32
  45. #define RENAME_GADGET   33
  46. #define GRENAM_GADGET   34
  47. #define MOVE_GADGET     35
  48. #define SINFO_GADGET   36
  49. #define DINFO_GADGET   37
  50. #define ARC_GADGET   38
  51. #define DEARC_GADGET    39
  52. #define ARCLIST_GADGET   40
  53. #define ALLWIND_GADGET   41
  54. #define CLRWIND_GADGET   42
  55. #define ALLDIRS_GADGET   43
  56. #define CLRDIRS_GADGET   44
  57. #define CPYDIRS_GADGET   45
  58. #define DELDIRS_GADGET   46
  59. #define BYTE_GADGET     47
  60. #define FILENOTE_GADGET   48
  61. #define SCRIPT_GADGET   49
  62. #define SHOW_GADGET   50
  63.  
  64. #define BUT_FIRST DF0_GADGET
  65. #define FIRST_GADGET  But_gad[SHOW_GADGET-6]
  66. #define KILL_E        But_gad[EDIT_GADGET-6]
  67. #define KILL_SHOW     But_gad[SHOW_GADGET-6]
  68. #define KILL_ARC      But_gad[ARC_GADGET-6]
  69. #define KILL_DEARC    But_gad[DEARC_GADGET-6]
  70. #define KILL_ARCLIST  But_gad[ARCLIST_GADGET-6]
  71. #define KILL_COPYALL  But_gad[COPYALL_GADGET-6]
  72. #define KILL_RUN      But_gad[RUN_GADGET-6]
  73. #define KILL_EXECUTE  But_gad[EXECUTE_GADGET-6]
  74. #define KILL_FORMAT   But_gad[FORMAT_GADGET-6]
  75. #define KILL_DSKCPY   But_gad[DSKCPY_GADGET-6]
  76. #define KILL_SCRIPT   But_gad[SCRIPT_GADGET-6]
  77. #define KILL_CPYDIRS  But_gad[CPYDIRS_GADGET-6]
  78. #define KILL_DELDIRS  But_gad[DELDIRS_GADGET-6]
  79.  
  80. #define BUT_LAST   SHOW_GADGET
  81. #define WinIDCMP  CLOSEWINDOW | REFRESHWINDOW | GADGETUP | MOUSEBUTTONS | SELECTDOWN
  82. #define WinIDCMPM  CLOSEWINDOW | REFRESHWINDOW | GADGETUP | MOUSEBUTTONS | MOUSEMOVE | SELECTDOWN
  83. #define GADFLAGS  NULL,5,174,53,6,GADGHCOMP|GADGHBOX,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,NULL,NULL,NULL,NULL,NULL
  84. #define GADTEXT 3,2,JAM2,0,0,NULL
  85. extern struct FileHandle  *Open();
  86. extern APTR AllocMem();
  87. struct IntuitionBase *IntuitionBase;
  88. struct GfxBase *GfxBase;
  89. struct IntuiMessage *message;
  90. struct RastPort *rp;
  91. struct Window *w;
  92. BOOL MOUSEYES=TRUE;
  93. BOOL MOUSENO=FALSE;
  94. char ASTR[30];
  95. int DFfirst=1;
  96. char *CR = "\n\n"; 
  97. int status = 0;
  98. char *EP,*CDP,*SHOWP,*ARCP,*COPYP,*RUNP,*DISKCOPYP,*FORMATP,*EXECUTEP,
  99. *PLAYERP, *DELETEP, *ENDCLIP;
  100. char *RSHOW = "ram:DUC/Show";
  101. char *RRUN = "ram:DUC/Run";
  102. char *RDISKCOPY = "ram:DUC/Diskcopy";
  103. char *RFORMAT = "ram:DUC/Format";
  104. char *REXECUTE = "ram:DUC/Execute";
  105. char *DE = "sys:c/E";
  106. char *DARC = "sys:c/Arc";
  107. char *DSHOW = "sys:c/Show";
  108. char *DCOPY = "sys:c/Copy";
  109. char *DRUN = "sys:c/Run";
  110. char *DDISKCOPY = "sys:system/Diskcopy";
  111. char *DCD = "sys:c/Cd";
  112. char *DFORMAT = "sys:system/Format";
  113. char *DEXECUTE = "sys:c/Execute";
  114. char *DPLAYER = "sys:c/Player";
  115. char *DDELETE = "sys:c/Delete";
  116. char *DENDCLI = "sys:c/EndCLI";
  117.    int gadgid;       /*ID Code identifying which gadget*/
  118. /*Error Gadget string gadget*/
  119. USHORT str_pairs2[] = { 0,0,  639,0,  639,9,  0,9, 0,0,};
  120. struct Border str_border2 =
  121. {
  122.    -1,-1,/*Leftedge, Topedge*/
  123.    1,1,JAM1,/*FrontPen, BackPen, Drawmode*/
  124.    5,   /*Number of Pairs*/
  125.    (APTR) &str_pairs2,  /*XY, Pointer to XY pairs*/
  126.    NULL,
  127. };
  128.  
  129. /*Error display*/
  130. char err_buf[MAXCD+1];
  131. struct StringInfo err_str =
  132. { &err_buf, NULL, 0, MAXCD+1,  0, 0, 0, 0, 2,0, NULL, 0, NULL, };
  133.  
  134. struct Gadget Err_gad =
  135. {
  136.    NULL, /*last in the list of gadgets*/
  137.    30,1,
  138.    561,9,
  139.    GADGHCOMP, GADGIMMEDIATE | RELVERIFY | STRINGCENTER,
  140.    STRGADGET,
  141.    (APTR) &str_border2,
  142.    NULL,
  143.    NULL,  /*Intuitext pointer*/
  144.    0,&err_str,
  145.    ERR_GADGET,
  146.    NULL,
  147. };
  148.  
  149. /*Source Destination string gadgets*/
  150. USHORT str_pairs[] = { 0,0,  280,0,  280,9,  0,9, 0,0,};
  151. struct Border CUR_str_border =
  152. {
  153.    -1,-1,/*Leftedge, Topedge*/
  154.    3,1,JAM1,/*FrontPen, BackPen, Drawmode*/
  155.    5,   /*Number of Pairs*/
  156.    (APTR) &str_pairs,  /*XY, Pointer to XY pairs*/
  157.    NULL,
  158. };
  159. struct Border CP_str_border =
  160. {
  161.    -1,-1,/*Leftedge, Topedge*/
  162.    1,1,JAM1,/*FrontPen, BackPen, Drawmode*/
  163.    5,   /*Number of Pairs*/
  164.    (APTR) &str_pairs,  /*XY, Pointer to XY pairs*/
  165.    NULL,
  166. };
  167. struct Border str_border =
  168. {
  169.    -1,-1,/*Leftedge, Topedge*/
  170.    1,1,JAM1,/*FrontPen, BackPen, Drawmode*/
  171.    5,   /*Number of Pairs*/
  172.    (APTR) &str_pairs,  /*XY, Pointer to XY pairs*/
  173.    NULL,
  174. };
  175.  
  176. /* Execute String Gadget */
  177. struct IntuiText Exe_text = {1,0,JAM1,283,0,NULL,"E",NULL,};
  178. char Exe_buf[MAXCD+1];
  179. struct StringInfo Exe_str =
  180. { &Exe_buf, NULL, 0, MAXCD+1,  0, 0, 0, 0, 2,0, NULL, 0, NULL, };
  181. struct Gadget Exe_gad =
  182. {
  183.    &Err_gad,
  184.    345,141,
  185.    281,9,
  186.    GADGHCOMP, GADGIMMEDIATE | RELVERIFY,
  187.    STRGADGET,
  188.    (APTR) &str_border,
  189.    NULL,
  190.    &Exe_text,
  191.    0,
  192.    &Exe_str,
  193.    EXECUTE_GADGET,
  194.    NULL,
  195. };
  196.  
  197. struct IntuiText Curdir_text = {3,0,JAM1,283,0,NULL," ",NULL,};
  198. char cd_buf[MAXCD+1];
  199. struct StringInfo Curdir_str =
  200. { &cd_buf, NULL, 0, MAXCD+1,  0, 0, 0, 0, 2,0, NULL, 0, NULL, };
  201. struct Gadget Curdir_gad =
  202. {
  203.    &Exe_gad,
  204.    345,151,
  205.    278,9,
  206.    GADGHCOMP, GADGIMMEDIATE | RELVERIFY,
  207.    STRGADGET,
  208.    (APTR) &CUR_str_border,
  209.    NULL,
  210.    &Curdir_text,
  211.    0,
  212.    &Curdir_str,
  213.    CURDIR_GADGET,
  214.    NULL,
  215. };
  216.  
  217. /*Destination definitions*/
  218. char cp_buf[MAXCD+1];
  219. struct IntuiText Cpdir_text = {1,0,JAM1,283,0,NULL," ",NULL,};
  220. struct StringInfo Cpdir_str =
  221. { &cp_buf, NULL, 0, MAXCD+1,  0, 0, 0, 0, 2,0, NULL, 0, NULL, };
  222.  
  223. struct Gadget Cpdir_gad =
  224. {
  225.    &Curdir_gad,
  226.    345,161,
  227.    278,9,
  228.    GADGHCOMP, GADGIMMEDIATE | RELVERIFY,
  229.    STRGADGET,
  230.    (APTR) &CP_str_border,
  231.    NULL,
  232.    &Cpdir_text,
  233.    0,
  234.    &Cpdir_str,
  235.    CPDIR_GADGET,
  236.    NULL,
  237. };
  238. struct Gadget *CD;
  239. /*File Select Gadget Declarations*/
  240. struct Image Dslide_img;
  241. struct PropInfo Dslide_prop;
  242. struct Gadget DSlide_gad =
  243. {
  244.    &Cpdir_gad,  /*Next gadget*/
  245.    322,95,     /*Left, Top edge*/
  246.    20,75,     /*Width Height*/
  247.    GADGHNONE,   /*Flags*/
  248.    GADGIMMEDIATE | RELVERIFY | FOLLOWMOUSE,
  249.    PROPGADGET,  /*Gadget type*/
  250.    (APTR)&Dslide_img,   /*Border definition*/
  251.    NULL, /*Select render*/
  252.    NULL,     /*Gadget text*/
  253.    0,     /*MutualExclude*/
  254.    (APTR) &Dslide_prop, /*Special Info - proportional specification*/
  255.    DSLIDE_GADGET,
  256.    NULL,
  257. };
  258. struct Gadget *SL;
  259.  
  260. /*File Select Gadget Declarations*/
  261. struct Image slide_img;
  262. struct PropInfo slide_prop;
  263. struct Gadget Slide_gad =
  264. {
  265.    &DSlide_gad,  /*Next gadget*/
  266.    322,12,     /*Left, Top edge*/
  267.    20,75,     /*Width Height*/
  268.    GADGHNONE,   /*Flags*/
  269.    GADGIMMEDIATE | RELVERIFY | FOLLOWMOUSE,
  270.    PROPGADGET,  /*Gadget type*/
  271.    (APTR)&slide_img,   /*Border definition*/
  272.    NULL, /*Select render*/
  273.    NULL,     /*Gadget text*/
  274.    0,     /*MutualExclude*/
  275.    (APTR) &slide_prop, /*Special Info - proportional specification*/
  276.    SLIDE_GADGET,
  277.    NULL,
  278. };
  279.  
  280. /*Button Gadget IDs*/
  281.  
  282. struct IntuiText But_text[] =
  283. {
  284.    GADTEXT," DF0:  ",NULL,
  285.    GADTEXT," DF1:  ",NULL,
  286.    GADTEXT," DF2:  ",NULL,
  287.    GADTEXT," RAM:  ",NULL,
  288.    GADTEXT," ALL   ",NULL,
  289.    GADTEXT," DH0:  ",NULL,
  290.    GADTEXT," DH1:  ",NULL,
  291.    GADTEXT," DH2:  ",NULL,
  292.    GADTEXT," SWAP  ",NULL,
  293.    GADTEXT," CLEAR ",NULL,
  294.    GADTEXT,"DELETE ",NULL,
  295.    GADTEXT," EDIT  ",NULL,
  296.    GADTEXT,"FORMAT ",NULL,
  297.    GADTEXT,"DSKCPY ",NULL,
  298.    GADTEXT,"COPYALL",NULL,
  299.    GADTEXT,"DELDIR ",NULL,
  300.    GADTEXT,"GETDIR ",NULL,
  301.    GADTEXT," MKDIR ",NULL,
  302.    GADTEXT,"PARENT ",NULL,
  303.    GADTEXT," ROOT  ",NULL,
  304.    GADTEXT," TYPE  ",NULL,
  305.    GADTEXT," HTYPE ",NULL,
  306.    GADTEXT," PRINT ",NULL,
  307.    GADTEXT," EXEC  ",NULL,
  308.    GADTEXT,"  RUN  ",NULL,
  309.    GADTEXT," COPY  ",NULL,
  310.    GADTEXT,"MOVDEL ",NULL,
  311.    GADTEXT,"RENAME ",NULL,
  312.    GADTEXT,"GRENAM ",NULL,
  313.    GADTEXT," MOVE  ",NULL,
  314.    GADTEXT," SINFO ",NULL,
  315.    GADTEXT," DINFO ",NULL,
  316.    GADTEXT,"  ARC  ",NULL,
  317.    GADTEXT,"DE-ARC ",NULL,
  318.    GADTEXT,"A-LIST ",NULL,
  319.    GADTEXT,"ALLWIND",NULL,
  320.    GADTEXT,"CLRWIND",NULL,
  321.    GADTEXT,"ALLDIRS",NULL,
  322.    GADTEXT,"CLRDIRS",NULL,
  323.    GADTEXT,"CPYDIRS",NULL,
  324.    GADTEXT,"DELDIRS",NULL,
  325.    GADTEXT," BYTE  ",NULL,
  326.    GADTEXT,"FILNOTE",NULL,
  327.    GADTEXT,"SCRIPT ",NULL,
  328.    GADTEXT," SHOW  ",NULL,
  329. };
  330.  
  331. struct Gadget But_gad[] =
  332. {
  333.    GADFLAGS,DF0_GADGET,NULL,
  334.    GADFLAGS,DF1_GADGET,NULL,
  335.    GADFLAGS,DF2_GADGET,NULL,
  336.    GADFLAGS,RAM_GADGET,NULL,
  337.    GADFLAGS,ALL_GADGET,NULL,
  338.    GADFLAGS,DH0_GADGET,NULL,
  339.    GADFLAGS,DH1_GADGET,NULL,
  340.    GADFLAGS,DH2_GADGET,NULL,
  341.    GADFLAGS,SWAP_GADGET,NULL,
  342.    GADFLAGS,CLEAR_GADGET,NULL,
  343.    GADFLAGS,DELETE_GADGET,NULL,
  344.    GADFLAGS,EDIT_GADGET,NULL,
  345.    GADFLAGS,FORMAT_GADGET,NULL,
  346.    GADFLAGS,DSKCPY_GADGET,NULL,
  347.    GADFLAGS,COPYALL_GADGET,NULL,
  348.    GADFLAGS,DELDIR_GADGET,NULL,
  349.    GADFLAGS,GETDIR_GADGET,NULL,
  350.    GADFLAGS,MAKEDIR_GADGET,NULL,
  351.    GADFLAGS,PARENT_GADGET,NULL,
  352.    GADFLAGS,ROOT_GADGET,NULL,
  353.    GADFLAGS,TYPE_GADGET,NULL,
  354.    GADFLAGS,HTYPE_GADGET,NULL,
  355.    GADFLAGS,PRINT_GADGET,NULL,
  356.    GADFLAGS,EXEC_GADGET,NULL,
  357.    GADFLAGS,RUN_GADGET,NULL,
  358.    GADFLAGS,COPY_GADGET,NULL,
  359.    GADFLAGS,MOVDEL_GADGET,NULL,
  360.    GADFLAGS,RENAME_GADGET,NULL,
  361.    GADFLAGS,GRENAM_GADGET,NULL,
  362.    GADFLAGS,MOVE_GADGET,NULL,
  363.    GADFLAGS,SINFO_GADGET,NULL,
  364.    GADFLAGS,DINFO_GADGET,NULL,
  365.    GADFLAGS,ARC_GADGET,NULL,
  366.    GADFLAGS,DEARC_GADGET,NULL,
  367.    GADFLAGS,ARCLIST_GADGET,NULL,
  368.    GADFLAGS,ALLWIND_GADGET,NULL,
  369.    GADFLAGS,CLRWIND_GADGET,NULL,
  370.    GADFLAGS,ALLDIRS_GADGET,NULL,
  371.    GADFLAGS,CLRDIRS_GADGET,NULL,
  372.    GADFLAGS,CPYDIRS_GADGET,NULL,
  373.    GADFLAGS,DELDIRS_GADGET,NULL,
  374.    GADFLAGS,BYTE_GADGET,NULL,
  375.    GADFLAGS,FILENOTE_GADGET,NULL,
  376.    GADFLAGS,SCRIPT_GADGET,NULL,
  377.    GADFLAGS,SHOW_GADGET,NULL,
  378. };
  379.  
  380. /*BORDER DEFINITION FOR SOURCE FILE SELECT AREA*/
  381. USHORT Fil_pairs[] = { 10,13,  321,13,  321,87, 10,87, 10,13,};
  382. struct Border Fil_border =
  383. {
  384.    -1,-1,    /*Leftedge, Topedge*/
  385.    1,0,JAM1,    /*FrontPen, BackPen, Drawmode*/
  386.    5,        /*Number of Pairs*/
  387.    (APTR) Fil_pairs,   /*XY, Pointer to XY pairs*/
  388.    NULL,    /*More borders*/
  389. };
  390. /*BORDER DEFINITION FOR DESTINATION FILE SELECT AREA*/
  391. USHORT DFil_pairs[] = { 10,96,  321,96,  321,170, 10,170, 10,96,};
  392. struct Border DFil_border =
  393. {
  394.    -1,-1,    /*Leftedge, Topedge*/
  395.    1,0,JAM1,    /*FrontPen, BackPen, Drawmode*/
  396.    5,        /*Number of Pairs*/
  397.    (APTR) DFil_pairs,   /*XY, Pointer to XY pairs*/
  398.    NULL,    /*More borders*/
  399. };
  400.  
  401.  
  402. struct NewWindow nw =
  403. {
  404.    0,0,
  405.    640,172,
  406.    0,1,       /*Detail, block pens*/
  407.    WinIDCMP,    /*IDCMP flags*/
  408.    WINDOWSIZING | WINDOWDEPTH | WINDOWDRAG | REPORTMOUSE | WINDOWCLOSE
  409.    | ACTIVATE | RMBTRAP | SMART_REFRESH,
  410.    &FIRST_GADGET, /*First gadget in the list*/
  411.    NULL,    /*User checkmark*/
  412.    " DirUtil X VERSION 5.00 ",
  413.    NULL,
  414.    NULL,    /*Pointer to superbitmap*/
  415.    100,40,640,172,  /*Now sizeable*/
  416.    WBENCHSCREEN,
  417. };
  418.  
  419. /*The following structure is used to hold the SOURCE directory entries*/
  420. struct DT
  421. {
  422.    char  dt_fname[MAXCHAR];/*File name*/
  423.    short dt_select; /*Select flag*/
  424.    short dt_dir;   /*Directory flag*/
  425.    long  dt_size;   /*File size*/
  426. };
  427.  
  428. struct DT SDT[MAXFILE+1];
  429. struct DT DDT[MAXFILE+1];
  430. struct DT *CDT, *CDTT;
  431. struct DT *CDT1;
  432.  
  433. struct InfoData *InfoData;
  434. struct FileLock *InitialCurrentDirLock, *CurrentDirLock, *SHOWLOCK,
  435.  *ARCLOCK, *ELOCK,*DISKCOPYLOCK,*COPYLOCK,*CDLOCK,*RUNLOCK,
  436.  *FORMATLOCK,*EXECUTELOCK,*PLAYERLOCK,*SCRIPTLOCK,
  437.  *LIBLOCK,*LIBCLOCK,*RAMLOCK,*LOCK, *RAMCLOCK,*ASSIGNLOCK,
  438.  *ENDCLILOCK, *DELETELOCK, *fl;
  439. struct FileLock *RDISKCOPYLOCK, *RRUNLOCK,*RFORMATLOCK,*REXECUTELOCK,
  440.  *RASSIGNLOCK, *RSHOWLOCK;
  441. struct FileHandle *window = NULL; /*file handle for type & print*/
  442. struct FileHandle *workfp = NULL; /*file handle to file to be displayed*/
  443. long bytes;
  444. ULONG MessageClass;
  445. USHORT code;
  446. int Sfiles,Dfiles;
  447. int ac;
  448. int Snumdir,Dnumdir;
  449. int Scur_index,Dcur_index;
  450. int *numdir,file,pmode;
  451. int lenn = 1;
  452. char *cpdbuf;
  453. char *ptr5;
  454. int files;
  455. int *cur_index;
  456. int NILFD = 0;
  457. int linecount;
  458. unsigned int index;
  459. int err,done = FALSE,DEL = 1,wind_start, dirflag;
  460. char cpdir[MAXCD+1];
  461. char curdir[MAXCD+1],requestedsd[MAXCD+1],requesteddd[MAXCD+1];
  462. char command[300];
  463. char *DIR;
  464. char *requestedcd;
  465. unsigned char buffer[80];
  466. unsigned char buf[512];
  467. unsigned char blank[37] = "                                    ";
  468. void   Print_to_printer(), copy(), new_dir(),
  469.    sel_file(), par_dir(), Print_to_screen(), Hprint_to_screen(),
  470.    MyOpen(), DoHex(), MyDone(), WaitSpace(), DoHeader(), MyClose();
  471. struct FileLock *oldlock;
  472.  
  473. main(argc,argv)
  474. char *argv[];
  475. {
  476.    struct Gadget *gad_ptr;
  477.    struct IntuiText *text_ptr;
  478.    register i;
  479.    ac = argc;
  480.    EP = DE;
  481.    SHOWP = RSHOW;
  482.    ARCP = DARC;
  483.    COPYP = DCOPY;
  484.    RUNP = RRUN;
  485.    DISKCOPYP = RDISKCOPY;
  486.    FORMATP = RFORMAT;
  487.    EXECUTEP = REXECUTE;
  488.    CDP = DCD;
  489.    PLAYERP = DPLAYER;
  490.    DELETEP = DDELETE;
  491.    ENDCLIP = DENDCLI;
  492.    SHOWLOCK = Lock(DSHOW,ACCESS_READ); /* Check to see if they exist */
  493.    ARCLOCK = Lock(DARC,ACCESS_READ);
  494.    ELOCK = Lock(DE,ACCESS_READ);
  495.    CDLOCK = Lock(DCD,ACCESS_READ);
  496.    COPYLOCK = Lock(DCOPY,ACCESS_READ);
  497.    RUNLOCK = Lock(DRUN,ACCESS_READ);
  498.    DISKCOPYLOCK = Lock(DDISKCOPY,ACCESS_READ);
  499.    FORMATLOCK = Lock(DFORMAT,ACCESS_READ);
  500.    EXECUTELOCK = Lock(DEXECUTE,ACCESS_READ);
  501.    PLAYERLOCK = Lock(DPLAYER,ACCESS_READ);
  502.    DELETELOCK = Lock(DDELETE,ACCESS_READ);
  503.    ENDCLILOCK = Lock(DENDCLI,ACCESS_READ);
  504.    RAMCLOCK = Lock("ram:DUC",ACCESS_READ);
  505.    LIBLOCK = Lock("ram:libs",ACCESS_READ);
  506.    LIBCLOCK = Lock("sys:libs/icon.library",ACCESS_READ);
  507.    ASSIGNLOCK = Lock("sys:c/Assign",ACCESS_READ);
  508.    if(!EXECUTELOCK) { 
  509.       puts("Execute COMMAND MUST BE IN SYS c\n");
  510.       close_things(); 
  511.       exit();
  512.       } 
  513.    if(!ASSIGNLOCK) { 
  514.       puts("Assign COMMAND MUST BE IN SYS c\n");
  515.       close_things(); 
  516.       exit();
  517.       } 
  518.          if(RAMCLOCK) {UnLock(RAMCLOCK);}
  519.          else 
  520.          if (!(RAMCLOCK = CreateDir("ram:DUC",ACCESS_READ))) { }
  521.          else UnLock(RAMCLOCK);
  522. if((DISKCOPYLOCK)&&(ASSIGNLOCK)&&(RUNLOCK)&&(LIBCLOCK))
  523. {  
  524.          if(LIBLOCK) {UnLock(LIBLOCK);}
  525.          else
  526.          if (!(LIBLOCK = CreateDir("ram:libs",ACCESS_READ))) { }
  527.          else UnLock(LIBLOCK);
  528.    if(DISKCOPYLOCK){
  529.        copy("sys:system/Diskcopy","ram:DUC");
  530.        DISKCOPYP = RDISKCOPY;
  531.    }
  532.    if(LIBCLOCK){
  533.    copy ("sys:libs/icon.library", "ram:libs");
  534.    sprintf(command, "%s","Assign libs: ram:libs");
  535.    Execute(command,0,0);
  536.    }
  537.    if(RUNLOCK){
  538.    copy ("sys:c/Run","ram:DUC");
  539.    RUNP = RRUN;
  540.    }
  541.    if(ASSIGNLOCK){
  542.    copy ("sys:c/Assign", "ram:DUC");
  543. }
  544. }
  545.    if(FORMATLOCK){
  546.        copy("sys:system/Format","ram:DUC");
  547.        FORMATP = RFORMAT;
  548. }
  549.    if(SHOWLOCK){
  550.        copy("sys:c/Show","ram:DUC");
  551.        SHOWP = RSHOW;
  552. }
  553. /*create cariage return file */
  554. file = creat("ram:CRT",pmode);
  555. status = write(file,CR,lenn);
  556. status = write(file,CR,lenn);
  557. status = close(file);    
  558.  
  559.    *cp_buf = 0;
  560.    *cd_buf = 0;
  561.    strcpy(curdir,"sys:");
  562.    strcpy(cpdir,"ram:");
  563.    
  564.    strcpy(requestedsd,curdir);
  565.    strcpy(requesteddd,cpdir);
  566.    if(!(CurrentDirLock = Lock(curdir,ACCESS_READ))) {
  567.       if (ac == 2) puts("Could not lock DF0: disk!\n");
  568.       close_things(); exit();
  569.    }
  570.    InitialCurrentDirLock = CurrentDir(CurrentDirLock);
  571.  
  572.    /*Gadget initialization*/
  573.    slide_prop.Flags = FREEVERT | AUTOKNOB;
  574.    slide_prop.VertBody = 0;
  575.    slide_prop.VertPot = 0x8000;
  576.  
  577.    /*Gadget initialization*/
  578.    Dslide_prop.Flags = FREEVERT | AUTOKNOB;
  579.    Dslide_prop.VertBody = 0;
  580.    Dslide_prop.VertPot = 0x8000;
  581.  
  582.    /*Setup the button gadgets*/
  583.    for (i=0;i<(BUT_LAST-BUT_FIRST)+1;i++) {
  584.       gad_ptr = &But_gad[i];
  585.       text_ptr = &But_text[i];
  586.  
  587.       gad_ptr->LeftEdge = ((i%5) * 58) + 347;
  588.       gad_ptr->TopEdge = ((i/5) * 11) + 12;
  589.  
  590.       if(i)
  591.          gad_ptr->NextGadget = &But_gad[i-1];
  592.       else
  593.          gad_ptr->NextGadget = &Slide_gad;
  594.       gad_ptr->GadgetText = text_ptr;
  595.       text_ptr->LeftEdge = 0;
  596.       text_ptr->TopEdge = 0;
  597.    }
  598. GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0); 
  599.  
  600. IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",0);
  601.  
  602. if (!(w = (struct Window *) OpenWindow(&nw) )) {
  603.    if (ac == 2) puts("Could not open window\n");
  604.    close_things();   
  605.    exit();
  606.    }
  607.    ReportMouse(MOUSENO,&nw);
  608.  
  609.    rp = w->RPort;
  610.    DrawBorder(rp,&Fil_border,0,0);
  611.    DrawBorder(rp,&DFil_border,0,0);
  612.    dirflag = 1;
  613.    set_point();
  614.    getdir(cpdir);
  615.    new_dir();
  616.    dirflag = 0;  
  617.    set_point();    
  618.    getdir(curdir); 
  619.    new_dir();      
  620.  
  621.    display_error("Status: O.K.",0);
  622.    RefreshGadgets(&FIRST_GADGET,w,NULL);
  623.    if(!ARCLOCK) OffGadget(&KILL_ARC,w,NULL);
  624.    if(!ARCLOCK) OffGadget(&KILL_DEARC,w,NULL);
  625.    if(!ARCLOCK) OffGadget(&KILL_ARCLIST,w,NULL);
  626.    if(!SHOWLOCK) OffGadget(&KILL_SHOW,w,NULL);
  627.    if(!CDLOCK) OffGadget(&KILL_COPYALL,w,NULL);
  628.    if(!COPYLOCK) OffGadget(&KILL_COPYALL,w,NULL);
  629.    if(!COPYLOCK) OffGadget(&KILL_CPYDIRS,w,NULL);
  630.    if(!DELETELOCK) OffGadget(&KILL_DELDIRS,w,NULL);
  631.    if(!PLAYERLOCK) OffGadget(&KILL_SCRIPT,w,NULL);
  632.    if(!RUNLOCK) OffGadget(&KILL_RUN,w,NULL);
  633.    if(!EXECUTELOCK) OffGadget(&KILL_EXECUTE,w,NULL);
  634.    if(!DISKCOPYLOCK) OffGadget(&KILL_DSKCPY,w,NULL);
  635.    if(!ASSIGNLOCK) OffGadget(&KILL_DSKCPY,w,NULL);
  636.    if(!RUNLOCK) OffGadget(&KILL_DSKCPY,w,NULL);
  637.    if(!FORMATLOCK) OffGadget(&KILL_FORMAT,w,NULL);
  638.    if(!ELOCK) OffGadget(&KILL_E,w,NULL);
  639.    ModifyIDCMP(w,WinIDCMP);
  640.    for (;;) {
  641.       WaitPort(w->UserPort); 
  642.       message = (struct IntuiMessage *) GetMsg(w->UserPort);
  643.       MessageClass = message->Class;
  644.       code = message->Code;
  645.       ReplyMsg(message);
  646.       switch (MessageClass) {
  647.          case GADGETDOWN:
  648.             display_error("Status: O.K.",0);
  649.             do_gadgets(message,w);
  650.             break;
  651.  
  652.          case REFRESHWINDOW:
  653.             BeginRefresh(w); EndRefresh(w);
  654.             dis_files(*cur_index);
  655.             DrawBorder(rp,&Fil_border,0,0);
  656.             DrawBorder(rp,&DFil_border,0,0);
  657.             break;
  658.  
  659.          case CLOSEWINDOW:
  660.             close_things(); exit();
  661.             break;
  662.  
  663.          case MOUSEBUTTONS:
  664.             if (code == SELECTDOWN) {sel_file();
  665.             DEL = 1;
  666.             display_error("Status: O.K.",0);}
  667.             break;
  668.          case MOUSEMOVE:
  669.          case GADGETUP:
  670.             break; 
  671.          default:
  672.             break;
  673.       } /*end switch*/
  674.    } /*end for*/
  675. }
  676.  
  677. Info2(ddir)
  678. char *ddir;
  679. {
  680. InfoData = AllocMem(sizeof(struct InfoData),0);
  681. fl = Lock(ddir,ACCESS_READ);
  682. Info(fl,InfoData);
  683. sprintf(command,"%d Usable Bytes Free",((InfoData->id_NumBlocks - InfoData->id_NumBlocksUsed - 2) <= 0) ? 0 : ((InfoData->id_NumBlocks - InfoData->id_NumBlocksUsed - 2) * InfoData->id_BytesPerBlock));
  684. display_error(command,0);
  685. FreeMem(InfoData,sizeof(struct InfoData));
  686. UnLock(fl);
  687. }
  688.  
  689. do_gadgets(mes,win)
  690. struct IntuiMessage *mes;
  691. struct Window *win;
  692. {
  693.    struct FileLock *MakeDirLock;
  694.    struct Gadget *igad;
  695.    unsigned short i;
  696.    int jj;
  697.    igad = (struct Gadget *) mes->IAddress;
  698.    if((DFfirst==0)&&(gadgid!=FORMAT_GADGET)&&
  699.    (gadgid!=DSKCPY_GADGET)){DFfirst =1;
  700.                            display_error("Status: O.K.",0);
  701.                            if(ASSIGNLOCK){
  702.                            sprintf(command, "%s","Assign c: sys:c");
  703.                            Execute(command,0,0);}
  704. }
  705.    gadgid = igad->GadgetID;
  706.    if((DEL==0) && (DELETE_GADGET != gadgid) && (DELDIR_GADGET != gadgid)
  707.    && (DELDIRS_GADGET != gadgid))
  708.    {DEL = 1;
  709.     display_error("Status: O.K.",0);}
  710.    switch (gadgid) {
  711.       case CURDIR_GADGET:
  712.          dirflag = 0;
  713.          set_point();
  714.          ModifyIDCMP(w,0);
  715.          nullterm(cd_buf,MAXCD);
  716.          Curdir_str.NumChars = strlen(cd_buf);
  717.          Curdir_str.BufferPos = strlen(cd_buf);
  718.          getdir(cd_buf);
  719.          new_dir();
  720.          ModifyIDCMP(w,WinIDCMP);
  721.          break;
  722.       case CPDIR_GADGET:
  723.          dirflag = 1;
  724.          set_point();
  725.          ModifyIDCMP(w,0);
  726.          nullterm(cp_buf,MAXCD);
  727.          Cpdir_str.NumChars = strlen(cp_buf);
  728.          Cpdir_str.BufferPos = strlen(cp_buf);
  729.          getdir(cp_buf);
  730.          new_dir();
  731.          ModifyIDCMP(w,WinIDCMP);
  732.          break;
  733.       case EXECUTE_GADGET:
  734.          nullterm(Exe_buf,MAXCD);
  735.          Exe_str.NumChars = strlen(Exe_buf);
  736.          Exe_str.BufferPos = strlen(Exe_buf);
  737.          break;
  738.       case SLIDE_GADGET:
  739.          ModifyIDCMP(w,WinIDCMPM);
  740.          if((message->MouseY>=95)&&(message->MouseY<=170)) gadgid = DSLIDE_GADGET;
  741.          else{
  742.          dirflag = 0;
  743.          set_point();
  744.          jj=11;
  745.          do{
  746.          do{  
  747.          ReportMouse(MOUSEYES,&nw);  
  748.          WaitPort(w->UserPort);
  749.          message = (struct IntuiMessage *) GetMsg(w->UserPort);
  750.          MessageClass = message->Class;
  751.          ReplyMsg(message);
  752.          jj=jj+1;
  753.          }while((jj<=10)&&(MessageClass!=GADGETUP));
  754.          jj=0;
  755.          ReportMouse(MOUSENO,&nw);
  756.          rdis_files();
  757.          }
  758.          while(MessageClass!=GADGETUP);
  759.          do{  
  760.          ModifyIDCMP(w,WinIDCMP);
  761.          if((message = (struct IntuiMessage *) GetMsg(w->UserPort)))ReplyMsg(message);
  762.          }while (message);
  763.          break;
  764.          }
  765.       case DSLIDE_GADGET:
  766.          ModifyIDCMP(w,WinIDCMPM);
  767.          dirflag = 1;
  768.          set_point();
  769.          jj=11;
  770.          do{
  771.          do{  
  772.          ReportMouse(MOUSEYES,&nw);  
  773.          WaitPort(w->UserPort);
  774.          message = (struct IntuiMessage *) GetMsg(w->UserPort);
  775.          MessageClass = message->Class;
  776.          ReplyMsg(message);
  777.          jj=jj+1;
  778.          }while((jj<=10)&&(MessageClass!=GADGETUP));
  779.          jj=0;
  780.          ReportMouse(MOUSENO,&nw);
  781.          rdis_files();
  782.          }
  783.          while(MessageClass!=GADGETUP);
  784.          do{  
  785.          ModifyIDCMP(w,WinIDCMPM);
  786.          if((message = (struct IntuiMessage *) GetMsg(w->UserPort)))ReplyMsg(message);
  787.          }while (message);
  788.          break;
  789.       case ROOT_GADGET:
  790.          par_dir(gadgid);
  791.          break;
  792.       case PARENT_GADGET:
  793.          par_dir(gadgid);
  794.          break;
  795.  
  796.       case FORMAT_GADGET: {
  797.                if(DFfirst == 1){ DFfirst=0;
  798.                          display_error("****CLICK AGAIN TO FORMAT****",0);      
  799.                          if(ASSIGNLOCK){
  800.                          sprintf(command, "%s","Assign c: ram:DUC");
  801.                          Execute(command,0,0);
  802.                          }
  803.                          break;
  804.                }else{DFfirst=1;
  805.     sprintf(command,"%s %s %s %s %s",FORMATP,"DRIVE",cpdbuf,"NAME",Exe_buf);
  806.     Execute(command,0,0);
  807.     display_error("***** NO ERROR - FORMAT COMPLETE *****",0);
  808.     }}
  809.     break;
  810.       case DSKCPY_GADGET: {
  811.                if(DFfirst == 1){ DFfirst=0;
  812.                          display_error("****CLICK AGAIN TO DISKCOPY****",0);      
  813.                          if(ASSIGNLOCK){
  814.                          sprintf(command, "%s","Assign c: ram:DUC");
  815.                          Execute(command,0,0);
  816.                          }
  817.                          break;
  818.                }else{
  819.     nullterm(cd_buf,MAXCD);
  820.     nullterm(cp_buf,MAXCD);
  821.     if(dirflag == 0)
  822.     sprintf(command,"%s %s %s %s %s",DISKCOPYP,"<ram:CRT",cd_buf,"TO",cp_buf);
  823.     else
  824.     sprintf(command,"%s %s %s %s %s",DISKCOPYP,"<ram:CRT",cp_buf,"TO",cd_buf);
  825.     Execute(command,0,0);
  826.     DFfirst = 1;
  827.     display_error("***** DISK COPY COMPLETE *****",0);
  828.     }}
  829.     break;
  830.       case SCRIPT_GADGET: 
  831.       case SHOW_GADGET:
  832.       case ARCLIST_GADGET:
  833.       case FILENOTE_GADGET:
  834.       case ARC_GADGET:
  835.       case DEARC_GADGET:
  836.       case COPY_GADGET:
  837.       case RENAME_GADGET:
  838.       case TYPE_GADGET:
  839.       case HTYPE_GADGET:
  840.       case PRINT_GADGET:
  841.       case EXEC_GADGET:
  842.       case RUN_GADGET:
  843.       case MOVE_GADGET:
  844.       case MOVDEL_GADGET:
  845.       case GRENAM_GADGET:
  846.       case COPYALL_GADGET:
  847.       case CPYDIRS_GADGET:
  848.          action_on_selected(gadgid);
  849.          break;
  850.       case DELETE_GADGET:
  851.                if(DEL == 1){ DEL=0;
  852.                          display_error("****CLICK AGAIN TO DELETE****",0);      
  853.                          break;
  854.                }else{ action_on_selected(gadgid);
  855.                       break;}      
  856.       case DELDIRS_GADGET:
  857.                if(DEL == 1){ DEL=0;
  858.                          display_error("****CLICK AGAIN TO DELETE****",0);      
  859.                          break;
  860.                }else{ action_on_selected(gadgid);
  861.                       break;}      
  862.       case DELDIR_GADGET:
  863.                if(DEL == 1){ DEL=0;
  864.                          display_error("****CLICK AGAIN TO DELETE****",0);      
  865.                          break;
  866.                }else{ action_on_selected(gadgid);}
  867.                       break;      
  868.       case SWAP_GADGET:
  869.          if(dirflag==1) dirflag = 0;
  870.          else dirflag = 1;
  871.          set_point();
  872.          RefreshGadgets(CD,w,NULL);
  873.          break;
  874.       case DINFO_GADGET:
  875.          if(dirflag==1)Info2(cd_buf);
  876.          else Info2(cp_buf);
  877.          break;
  878.        case SINFO_GADGET:
  879.          if(dirflag==0)Info2(cd_buf);
  880.          else Info2(cp_buf);
  881.          break;
  882.       case BYTE_GADGET:
  883.          bytes = 0;
  884.          files = 0;
  885.          CDTT=CDT;
  886.          for (i=0;i<*numdir;i++){
  887.          if ((CDTT->dt_select == 1) && (!(CDTT->dt_dir))) {
  888.             bytes = bytes + CDTT->dt_size;
  889.             files++;};
  890.             CDTT=CDTT+1;        
  891.          }
  892.          sprintf(command,"%d Bytes in %d Files",bytes,files);
  893.          display_error(command,0);
  894.          break;
  895.       case MAKEDIR_GADGET:
  896.          if(MakeDirLock = Lock(cpdbuf,ACCESS_READ)) {
  897.             UnLock(MakeDirLock);
  898.             display_error("Directory or File Already Exists " ,IoErr());
  899.             break;
  900.          } 
  901.          if (!(MakeDirLock = CreateDir(cpdbuf))) {
  902.             display_error("CreateDir Failed ",IoErr());
  903.             break;
  904.          };
  905.          UnLock(MakeDirLock);
  906.          getdir(DIR);
  907.          new_dir(); break;
  908.       case DF0_GADGET:
  909.          getdir("df0:"); new_dir(); break;
  910.       case DF1_GADGET:
  911.          getdir("df1:"); new_dir(); break;
  912.       case DF2_GADGET:
  913.          getdir("df2:"); new_dir(); break;
  914.       case DH0_GADGET:
  915.          getdir("dH0:"); new_dir(); break;
  916.       case DH1_GADGET:
  917.          getdir("dH1:"); new_dir(); break;
  918.       case DH2_GADGET:
  919.          getdir("dH2:"); new_dir(); break;
  920.       case RAM_GADGET:
  921.          getdir("ram:"); new_dir(); break;
  922.       case EDIT_GADGET:
  923.       display_error("Now Editing Selected File",0);
  924.       action_on_selected(gadgid);
  925.       display_error("Status: O.K.",0);
  926.       break;
  927.       case GETDIR_GADGET:
  928.          getdir(requestedcd);
  929.          new_dir();
  930.          break;
  931.       case ALLWIND_GADGET:
  932.          CDTT = CDT;
  933.          CDTT = CDTT + *cur_index;
  934.          for (i=0;i<MAXFNAME;i++){
  935.          if(!CDTT->dt_dir) CDTT->dt_select = 1;
  936.          CDTT = CDTT +1;
  937.          }
  938.          dis_files(*cur_index);
  939.          break;
  940.       case CLRWIND_GADGET:
  941.          CDTT=CDT;
  942.          CDTT = CDTT + *cur_index;
  943.          for (i=0;i<MAXFNAME;i++){
  944.          CDTT->dt_select = 0;
  945.          CDTT = CDTT +1;
  946.          }
  947.          dis_files(*cur_index);
  948.          break;
  949.       case CLRDIRS_GADGET:
  950.          CDTT=CDT;
  951.          for (i=0;i<*numdir;i++){
  952.          if(CDTT->dt_dir) CDTT->dt_select = 0;
  953.          CDTT = CDTT +1;
  954.          }
  955.          dis_files(*cur_index);
  956.          break;
  957.       case ALLDIRS_GADGET:
  958.          CDTT=CDT;
  959.          for (i=0;i<*numdir;i++){
  960.          if(CDTT->dt_dir) CDTT->dt_select = 1;
  961.          CDTT = CDTT +1;
  962.          }
  963.          dis_files(*cur_index);
  964.          break;
  965.       case CLEAR_GADGET:
  966.          CDTT=CDT;
  967.          for (i=0;i<*numdir;i++){
  968.          CDTT->dt_select = 0;
  969.          CDTT = CDTT +1;
  970.          }
  971.          dis_files(*cur_index);
  972.          break;
  973.       case ALL_GADGET:
  974.          CDTT=CDT;
  975.          for (i=0;i<*numdir;i++){
  976.          if (!CDTT->dt_dir) CDTT->dt_select = 1;
  977.          CDTT=CDTT+1;
  978.          }
  979.          dis_files(*cur_index);
  980.          break;
  981.       default:
  982.          break;
  983.    }
  984. }
  985.  
  986. getdir_dest()
  987. {
  988.    if(dirflag == 1) dirflag = 0;
  989.    else dirflag =1;
  990.    set_point();
  991.    getdir(DIR);
  992.    new_dir();
  993.    if(dirflag == 1) dirflag = 0;
  994.    else dirflag =1;
  995.  set_point();
  996. }
  997. new_dir_dest()
  998. {
  999. register i1;
  1000. struct DT *SDTT,*tt_DDTT,*DDTT,*t_DDTT;
  1001. int *Snum,*Dnum;
  1002. int temp,found,num;
  1003. SDTT=CDT;
  1004. Snum =numdir;
  1005. if(dirflag == 0)
  1006.    {DDTT = &DDT[0];
  1007.     Dnum = &Dnumdir;
  1008.     SDTT = &SDT[0];
  1009. }else{DDTT = &SDT[0];
  1010.     Dnum = &Snumdir;
  1011.     SDTT = &DDT[0];
  1012.     }
  1013.    temp = *Dnum;
  1014.    t_DDTT = DDTT;
  1015.    t_DDTT = t_DDTT + *Dnum;
  1016.    for(i1=0;i1<*Snum;i1++)
  1017.    {
  1018. /* move file to destination directory*/
  1019. /*add entry to destination directory */
  1020. /* sort directory and return to source directory*/
  1021.       if(SDTT->dt_select == 2)
  1022.       {
  1023.          num=0;
  1024.          found = 1;
  1025.          tt_DDTT = DDTT;
  1026.          do{
  1027.             found = strcmp(tt_DDTT->dt_fname ,SDTT->dt_fname);
  1028.             tt_DDTT = tt_DDTT +1;
  1029.             num = num+1;
  1030.            }
  1031.          while((num <= *Dnum) && (found !=0)); 
  1032.       if(found!=0){
  1033.          strcpy(t_DDTT->dt_fname,SDTT->dt_fname);
  1034.          t_DDTT->dt_select = 0;
  1035.          t_DDTT->dt_dir = SDTT->dt_dir;
  1036.          t_DDTT->dt_size = SDTT->dt_size;
  1037.          nullterm(t_DDTT->dt_fname,MAXCHAR);
  1038.          t_DDTT = t_DDTT +1;
  1039.          temp++;
  1040.          }
  1041.       else{
  1042.       tt_DDTT = tt_DDTT -1;
  1043.       tt_DDTT->dt_select = 0;
  1044.       tt_DDTT->dt_size = SDTT->dt_size;
  1045.       tt_DDTT->dt_dir = SDTT->dt_dir; 
  1046.       }
  1047.    }
  1048.    SDTT = SDTT + 1;
  1049.    }/*end of for*/
  1050. if(*Dnum != temp) qsort(DDTT,temp,(sizeof(struct DT)));
  1051. *Dnum = temp;
  1052. if(dirflag==1)dirflag=0;
  1053. else dirflag = 1;
  1054. set_point();
  1055. new_dir(); 
  1056. if(dirflag==1)dirflag=0;
  1057. else dirflag = 1;
  1058. set_point();
  1059. }/* end of routine*/   
  1060.   
  1061. getdir(DirToGet) 
  1062. char *DirToGet;
  1063. {
  1064.    struct FileLock *filelock;
  1065.    struct FileInfoBlock *fb;
  1066.    char EffectiveDir[MAXCD+1];
  1067.  
  1068.                
  1069.    if (!(*DirToGet)) strcpy(EffectiveDir,":");
  1070.    else strcpy(EffectiveDir,DirToGet);
  1071.    set_point();
  1072.    /*If we cant open requested dir, don't change*/
  1073. TRYAGAIN:
  1074.    if (!(filelock = Lock(EffectiveDir,ACCESS_READ))) {
  1075.       strcpy(EffectiveDir,DIR);
  1076.       display_error("Can't Lock Requested Directory ",IoErr());
  1077.       if(!(filelock = Lock(EffectiveDir,ACCESS_READ))) {
  1078.          display_error("Can't Lock Current Dir. Switching to Ram: ",IoErr());
  1079.          strcpy(EffectiveDir,"ram:");
  1080.          goto TRYAGAIN;
  1081.       }
  1082.    }
  1083.    /*Allocate the file info block*/
  1084.    fb = AllocMem(FBSIZE,MEMF_CLEAR | MEMF_PUBLIC);
  1085.    if (!Examine(filelock,fb)) {
  1086.       FreeMem(fb,FBSIZE);
  1087.       UnLock(filelock);
  1088.       display_error("Can't Read Info Block. Switching to Ram: ",IoErr());
  1089.       strcpy(EffectiveDir,"ram:");
  1090.       goto TRYAGAIN;
  1091.    }
  1092.    if(fb->fib_DirEntryType < 0) {  /*ITS A FILE- NOT A DIRECTORY*/
  1093.       strcpy(EffectiveDir,DIR);/*Forget request, use current*/
  1094.       FreeMem(fb,FBSIZE);
  1095.       UnLock(filelock);
  1096.       display_error("Directory Requested was Regular File - No Changes ",IoErr());
  1097.       goto TRYAGAIN;
  1098.    }
  1099.  
  1100.    /*Copy directory string into gadget structure*/
  1101.    strcpy(cpdbuf,EffectiveDir);
  1102.    Cpdir_str.NumChars = strlen(EffectiveDir);
  1103.    Cpdir_str.BufferPos = strlen(EffectiveDir);
  1104.    strcpy(DIR,EffectiveDir);
  1105.    strcpy(requestedcd,EffectiveDir);
  1106.    RefreshGadgets(CD,w,NULL);
  1107.  
  1108.    *numdir = 0;
  1109.    *cur_index = 0;
  1110.    /*Loop through each of the files in this directory*/
  1111.    while (ExNext(filelock,fb)) {
  1112.       if (fb->fib_DirEntryType < 0) CDT->dt_dir = 0;
  1113.       else CDT->dt_dir = -1;
  1114.       CDT->dt_select = 0;
  1115.       CDT->dt_size = fb->fib_Size;
  1116.       strcpy(CDT->dt_fname,fb->fib_FileName);
  1117.       nullterm(CDT->dt_fname,MAXCHAR);
  1118.       CDT = CDT +1; 
  1119.       if (++*numdir == MAXFILE) break;
  1120.    }
  1121.    set_point();
  1122.    qsort(CDT,*numdir,(sizeof (struct DT))); 
  1123.    FreeMem(fb,FBSIZE);
  1124.    UnLock(CurrentDirLock); /*Release old CD lock */
  1125.    UnLock(filelock);    /*Release new request lock*/
  1126.    CurrentDirLock = Lock(EffectiveDir);
  1127.    CurrentDir(CurrentDirLock); /*MAKE IT THE CURRENT DIRECTORY*/
  1128. }
  1129.  
  1130. rdis_files()
  1131. {
  1132.  USHORT Vpot;
  1133.    int numd;
  1134.    int pos;
  1135.  
  1136.    if (*numdir > MAXFNAME) {
  1137.    if (dirflag == 0)
  1138.        Vpot = slide_prop.VertPot;
  1139.    else
  1140.        Vpot = Dslide_prop.VertPot;
  1141.       Vpot >>= 1;
  1142.       Vpot &= 0x7fff;
  1143.       numd = *numdir - MAXFNAME;
  1144.       pos = ((float) Vpot / (float) 0x7fff) * numd;
  1145.       *cur_index = pos;
  1146.       dis_files(pos);
  1147.    }
  1148. }
  1149. void new_dir()
  1150. {
  1151.    USHORT Vbody;
  1152.  
  1153.    if (*numdir <= MAXFNAME) 
  1154.       Vbody = 0xffff;
  1155.    else {
  1156.       Vbody = ((float) 0x7fff)/(((float) *numdir)/((float) MAXFNAME));
  1157.       Vbody <<= 1;
  1158.    }
  1159.    *cur_index = 0;
  1160.    if (dirflag == 0)
  1161.       ModifyProp(SL,w,NULL,slide_prop.Flags,0,0,0,Vbody);
  1162.    else
  1163.       ModifyProp(SL,w,NULL,Dslide_prop.Flags,0,0,0,Vbody);
  1164.    dis_files(0);
  1165.    return;
  1166. }
  1167.  
  1168. set_point()
  1169. {
  1170.    if (dirflag == 0){
  1171.       CDT=&SDT[0];
  1172.       SL = &Slide_gad;
  1173.       CD = &Curdir_gad;
  1174.       wind_start = 14;
  1175.       numdir = &Snumdir;
  1176.       cur_index = &Scur_index;
  1177.       DIR = curdir;
  1178.       requestedcd = requestedsd;
  1179.       cpdbuf = cd_buf;
  1180.       CUR_str_border.FrontPen = 3;
  1181.       CP_str_border.FrontPen = 1;
  1182.     }  
  1183.     else{
  1184.       CDT=&DDT[0];
  1185.       SL = &DSlide_gad;
  1186.       CD = &Cpdir_gad;
  1187.       wind_start = 96;
  1188.       numdir = &Dnumdir;
  1189.       cur_index = &Dcur_index;
  1190.       DIR = cpdir;
  1191.       requestedcd = requesteddd;
  1192.       cpdbuf = cp_buf;
  1193.       CUR_str_border.FrontPen = 1;
  1194.       CP_str_border.FrontPen = 3;
  1195.     };  
  1196.     RefreshGadgets(&Curdir_gad,w,NULL);
  1197.     RefreshGadgets(&Cpdir_gad,w,NULL);
  1198. }
  1199. dis_files(pos)
  1200. int pos;
  1201. {
  1202.    register i;
  1203.  
  1204.    for (i=0;i<MAXFNAME;i++) dis_name(i+pos,i);
  1205. }
  1206.  
  1207. dis_name(file,pos)
  1208. register file,pos;
  1209. {
  1210. static char file_name[MAXCHAR+8];
  1211. static struct IntuiText file_text = {2,0,JAM2,15,13,NULL,(UBYTE *)file_name,NULL };
  1212.  
  1213.    /*Set the top position*/
  1214.    file_text.TopEdge = (pos*8)+wind_start;
  1215.  
  1216.    if (file == -1 || file >= *numdir) {
  1217.       sprintf(file_name,"%-38.38s","");
  1218.       file_text.FrontPen = 2;
  1219.       file_text.BackPen = 2;  /*black*/
  1220.    } else {
  1221.        CDTT=CDT;
  1222.        CDTT = CDTT+file;
  1223.        if (CDTT->dt_dir) {
  1224.          sprintf(file_name,"%-30.30s%-8.8s",CDTT->dt_fname,"");
  1225.          if (CDTT->dt_select) {
  1226.             file_text.FrontPen = 2; /*Black on Orange*/
  1227.             file_text.BackPen = 3;
  1228.          } else {
  1229.             file_text.FrontPen = 3; /*Orange on Black*/
  1230.             file_text.BackPen = 2;
  1231.          }
  1232.       } else {
  1233.          sprintf(file_name,"%-30.30s %7ld",CDTT->dt_fname,
  1234.          CDTT->dt_size);
  1235.          if (CDTT->dt_select) {
  1236.             file_text.FrontPen = 2; /*Black on White*/
  1237.             file_text.BackPen = 1;
  1238.          } else {
  1239.             file_text.FrontPen = 1; /*White on Black*/
  1240.             file_text.BackPen = 2;
  1241.          }
  1242.       }
  1243.    }
  1244.  
  1245.    /*Display the text*/
  1246.    PrintIText(rp,&file_text,0,0);
  1247. }
  1248.  
  1249. void sel_file()
  1250. {
  1251.    int file;
  1252.    char *ptr;
  1253.    struct DT *temp_CDT;
  1254.    struct DT *temp_CDT1;
  1255.    if((dirflag==0)&&(message->MouseY > (wind_start + (MAXFNAME*8)))) dirflag = 1;
  1256.    else if((dirflag==1)&&(message->MouseY < wind_start)) dirflag = 0;
  1257.    set_point();
  1258.    temp_CDT=CDT;
  1259.    temp_CDT1=CDT;
  1260.    if (message->MouseX < 12 || message->MouseX > 318 || message->MouseY < wind_start || message->MouseY >= (MAXFNAME*8+wind_start))
  1261.       return;
  1262.    file = message->MouseY - wind_start;
  1263.    file /= 8;
  1264.    if((!*numdir) || (file > MAXFNAME) || ((file+*cur_index) > *numdir))
  1265.       return;
  1266.  
  1267.  
  1268.    temp_CDT = temp_CDT+file+*cur_index ;
  1269.    
  1270.    if (temp_CDT->dt_dir) {
  1271.       temp_CDT1 = CDT;   
  1272.       ptr = DIR +strlen(DIR) - 1;
  1273.       if(temp_CDT->dt_select ^= 1)
  1274.       sprintf(requestedcd,"%s%s%s",DIR,((*ptr == ':') ? "":"/"),
  1275.       temp_CDT->dt_fname);
  1276.       else
  1277.       strcpy(requestedcd,DIR);
  1278.       dis_files(*cur_index);
  1279.       return;
  1280.    }
  1281.    temp_CDT->dt_select ^= 1;
  1282.    dis_name(file+ *cur_index,file);
  1283. }
  1284.  
  1285. action_on_selected(gadgid)
  1286. int gadgid;
  1287. {
  1288.    struct IntuiMessage *message;
  1289.    struct DT *temp_CDT, *sptr, *dptr;
  1290.    struct DT *CDTI;
  1291.    register i, i1, temp;
  1292.    char filename[MAXCD+MAXCHAR+2],dfilename[MAXCD+MAXCHAR+2];
  1293.    char *ptr,*ptr1;
  1294.    /*At each iteration, check for any IntuiMessages that would signal
  1295.    user wants to halt operation: GADGETUP(he hit a gadget) or
  1296.    MOUSEBUTTONS(button press on something we dont recognize)*/
  1297.  
  1298.    ModifyIDCMP(w,MOUSEBUTTONS);
  1299.    CDT1 = CDT;
  1300.    for (i=0;i<*numdir;i++) {
  1301.       if((gadgid != SHOW_GADGET) && (message = (struct IntuiMessage *) GetMsg(w->UserPort))) {
  1302.          ReplyMsg(message);
  1303.          MessageClass = message->Class;
  1304.          if(MessageClass==MOUSEBUTTONS){  
  1305.          display_error("OPERATION ABORTED",0);
  1306.          break;} 
  1307.       }   
  1308.       if((CDT1->dt_select) || (gadgid == COPYALL_GADGET)){
  1309.       ptr = DIR + strlen(DIR) - 1;
  1310.       if(dirflag==0)ptr1 = cpdir + strlen(cpdir)-1;
  1311.       else ptr1 = curdir + strlen(curdir)-1; 
  1312.             if (*ptr == ':')
  1313.                sprintf(filename,"%s%s",DIR,CDT1->dt_fname);
  1314.             else
  1315.                sprintf(filename,"%s/%s",DIR,CDT1->dt_fname);
  1316. /* get destination file name*/
  1317.             if(dirflag==0)           
  1318.             if (*ptr1 == ':')
  1319.                sprintf(dfilename,"%s%s",cpdir,CDT1->dt_fname);
  1320.             else
  1321.                sprintf(dfilename,"%s/%s",cpdir,CDT1->dt_fname);
  1322.             else
  1323.             if (*ptr1 == ':')
  1324.                sprintf(dfilename,"%s%s",curdir,CDT1->dt_fname);
  1325.             else
  1326.                sprintf(dfilename,"%s/%s",curdir,CDT1->dt_fname);
  1327.            
  1328.          switch (gadgid) {
  1329.             case MOVDEL_GADGET:
  1330.                if(dirflag ==0) copy(filename,cp_buf);
  1331.                else copy(filename,cd_buf);
  1332.                if(LOCK=Lock(dfilename,ACCESS_READ)){ 
  1333.                if(CDT1->dt_dir) {
  1334.                   display_error("File is a Directory",0);
  1335.                   break;
  1336.                }
  1337.                if(!(DeleteFile(filename))) 
  1338.                   display_error("Could Not Delete Requested File ",IoErr());
  1339.                else CDT1->dt_select = 2;
  1340.                UnLock(LOCK);}
  1341.                break;
  1342.             case DSKCPY_GADGET: 
  1343.             case DELETE_GADGET:
  1344.                if(CDT1->dt_dir) {
  1345.                   display_error("File is a Directory",0);
  1346.                   DEL = 1;
  1347.                    break;
  1348.                }
  1349.                if(!(DeleteFile(filename))) 
  1350.                   display_error("Could Not Delete Requested File ",IoErr());
  1351.                else CDT1->dt_select = 2;
  1352.                DEL = 1;
  1353.                break;
  1354.  
  1355.             case DELDIR_GADGET:
  1356.                if(!CDT1->dt_dir) {
  1357.                   display_error("File is not a Directory",0);
  1358.                   DEL = 1;
  1359.                   break;
  1360.                }
  1361.                if(!(DeleteFile(filename))) 
  1362.                   display_error("Could not Delete Requested Directory ",IoErr());
  1363.                else CDT1->dt_select = 2;
  1364.                   DEL = 1;
  1365.                break;
  1366.            
  1367.             case COPY_GADGET:
  1368.                if(dirflag == 0)copy(filename,cp_buf);
  1369.                else copy(filename,cd_buf);
  1370.                CDT1->dt_select = 2;
  1371.                break;
  1372.  
  1373.             case SHOW_GADGET:
  1374.                if(SHOWLOCK) {
  1375.                   display_error("Now Showing Selected Pictures",0);
  1376.                   sprintf(command,"%s %s",SHOWP,filename);
  1377.                   Execute(command,0,0);
  1378.                }
  1379.                break;
  1380.  
  1381.             case SCRIPT_GADGET:
  1382.                if(PLAYERLOCK) {
  1383.                   display_error("Now Playing Selected Scripts",0);
  1384.                   sprintf(command,"%s %s",PLAYERP,filename);
  1385.                   Execute(command,0,0);
  1386.                   display_error("Status: O.K.",0);
  1387.                }
  1388.                break;
  1389.  
  1390.             case DEARC_GADGET:
  1391.                if(ARCLOCK) {
  1392.                display_error("Extracting Files From Archive",0);
  1393.                if(dirflag == 0)
  1394.                sprintf(command,"%s %s %s %s",ARCP,"x",filename,cp_buf);
  1395.                else
  1396.                sprintf(command,"%s %s %s %s",ARCP,"x",filename,cd_buf);
  1397.                Execute(command,0,0);
  1398.                   display_error("Status: O.K.",0);
  1399.                }
  1400.                break;
  1401.             case COPYALL_GADGET:
  1402.                display_error("COPYING ALL FILES TO DESTINATON",0);
  1403.                if(dirflag == 0)
  1404.                sprintf(command,"%s %s %s %s",COPYP,cd_buf,"ALL TO",cp_buf);
  1405.                else
  1406.                sprintf(command,"%s %s %s %s",COPYP,cp_buf,"ALL TO",cd_buf);
  1407.                Execute(command,0,0);
  1408.                display_error("Status: O.K.",0);
  1409.                break;
  1410.  
  1411.             case CPYDIRS_GADGET:
  1412.                if(CDT1->dt_dir) {
  1413.                display_error("COPYING DIRECTORIES TO DESTINATON",0);
  1414.                if(LOCK = Lock(dfilename,ACCESS_READ)) UnLock(LOCK);
  1415.                else 
  1416.                if (!(LOCK = CreateDir(dfilename,ACCESS_READ))) {
  1417.                display_error("ERROR COPYING TO DESTINATION DIRECTORY",0);
  1418.                CDT1->dt_select = 0;
  1419.                 }
  1420.                else {UnLock(LOCK);
  1421.                if(dirflag == 0)
  1422.                sprintf(command,"%s %s %s %s",COPYP,filename,"ALL TO",dfilename);
  1423.                else
  1424.                sprintf(command,"%s %s %s %s",COPYP,filename,"ALL TO",dfilename);
  1425.                Execute(command,0,0);
  1426.                display_error("Status: O.K.",0);
  1427.                CDT1->dt_select = 2;
  1428.                }}break;
  1429.  
  1430.             case DELDIRS_GADGET:
  1431.                if(CDT1->dt_dir) {
  1432.                display_error("DELETEING REQUESTED DIRECTORIES",0);
  1433.                if(dirflag == 0)
  1434.                sprintf(command,"%s %s %s",DELETEP,filename,"ALL");
  1435.                else
  1436.                sprintf(command,"%s %s %s",DELETEP,filename,"ALL");
  1437.                Execute(command,0,0);
  1438.                DEL = 1;
  1439.                display_error("Status: O.K.",0);
  1440.                CDT1->dt_select = 2;
  1441.                }break;  
  1442.             case ARC_GADGET:
  1443.                if(ARCLOCK) {
  1444.                CDTI = CDT; 
  1445.                display_error("Adding Files To Destination Archive",0);
  1446.                for (i=1;i<=*numdir;i++){ /* Loop All Selected Files Together */ 
  1447.                   if ((CDTI->dt_select == 1) && (!(CDTI->dt_dir))){
  1448.                   CDTI->dt_select=0;
  1449.                   if (*ptr == ':')
  1450.                      sprintf(filename,"%s %s%s",filename,DIR,CDTI->dt_fname);
  1451.                   else
  1452.                      sprintf(filename,"%s %s/%s",filename,DIR,CDTI->dt_fname);
  1453.                }   CDTI = CDTI + 1;
  1454.                }
  1455.                if(dirflag ==0) 
  1456.                sprintf(command,"%s %s %s %s",ARCP,"a",cp_buf,filename);
  1457.                else
  1458.                sprintf(command,"%s %s %s %s",ARCP,"a",cd_buf,filename);
  1459.                Execute(command,0,0);
  1460.                   display_error("Status: O.K.",0);
  1461.                }
  1462.                break;
  1463.            case ARCLIST_GADGET:
  1464.                if(ARCLOCK) {
  1465.                display_error("Reading Files in Selected Arc File",0);
  1466.                sprintf(command,"%s %s %s",ARCP,"v",filename);
  1467.                Execute(command,0,0);
  1468.                   display_error("Status: O.K.",0);
  1469.                }
  1470.                break;
  1471.             case EXEC_GADGET:            
  1472.                sprintf(command,"%s %s %s %s",EXECUTEP,"> NIL:",filename,Exe_buf);
  1473.                Execute(command,0,0);
  1474.                break;
  1475.             case RUN_GADGET:            
  1476.                sprintf(command,"%s %s %s %s",RUNP,"> NIL:",filename,Exe_buf);
  1477.                Execute(command,0,0);
  1478.                break;
  1479.             case TYPE_GADGET:
  1480.                if(!CDT1->dt_dir) Print_to_screen(filename);
  1481.                break;
  1482.             case HTYPE_GADGET:
  1483.                if(!CDT1->dt_dir) Hprint_to_screen(filename);
  1484.                break;
  1485.             case PRINT_GADGET:
  1486.                if(!CDT1->dt_dir) Print_to_printer(filename);
  1487.                break;
  1488.             case MOVE_GADGET:
  1489.             if(dirflag == 0){
  1490.                ptr = cp_buf + strlen(cp_buf)-1;
  1491.                if (*ptr == ':')
  1492.                   sprintf(command,"%s%s",cp_buf,CDT1->dt_fname);
  1493.                else
  1494.                   sprintf(command,"%s/%s",cp_buf,CDT1->dt_fname);
  1495.             }else{
  1496.                ptr = cd_buf + strlen(cd_buf)-1;
  1497.                if (*ptr == ':')
  1498.                   sprintf(command,"%s%s",cd_buf,CDT1->dt_fname);
  1499.                else
  1500.                   sprintf(command,"%s/%s",cd_buf,CDT1->dt_fname);
  1501.                }
  1502.                if(!(Rename(filename,command)))
  1503.                   display_error("Cannot Rename to Requested Path ",IoErr());
  1504.                else CDT1->dt_select = 2;
  1505.             
  1506.             break;
  1507.             case GRENAM_GADGET:
  1508.                CONV_FILE_NAME();
  1509.                if(err == 1)
  1510.                     display_error("file name size error ",0);
  1511.                else   
  1512.                if(!(Rename(filename,cpdbuf))) 
  1513.                   display_error("Cannot Rename to Requested Path ",IoErr());
  1514.                else {
  1515.                     strcpy(CDT1->dt_fname,ASTR);
  1516.                     }
  1517.                break;
  1518.             case FILENOTE_GADGET:
  1519.          if (!(SetComment(filename,Exe_buf))) {
  1520.             display_error("Comment Failed on file",IoErr());
  1521.          };
  1522.             break;
  1523.             case RENAME_GADGET:
  1524.                if(!(Rename(filename,cpdbuf))) 
  1525.                   display_error("Cannot Rename to Requested Path ",IoErr());
  1526.                else {
  1527.                     ptr = cpdbuf + strlen(DIR);
  1528.                     if(*ptr=='/') ptr = ptr+1;
  1529.                     strcpy(CDT1->dt_fname,ptr);
  1530.                     }
  1531.                break;
  1532.  
  1533.                case EDIT_GADGET:
  1534.                 if(!CDT1->dt_dir)  {
  1535.                sprintf(command, "%s %s",EP,filename);
  1536.                Execute(command,0,NILFD);
  1537.                }
  1538.             break;
  1539.             default:
  1540.             break;
  1541.          } /*switch*/
  1542.       if ((gadgid != DELDIR_GADGET) 
  1543.       && (gadgid != DELETE_GADGET)
  1544.       && (gadgid != DELDIRS_GADGET)
  1545.       && (gadgid != COPY_GADGET)
  1546.       && (gadgid != CPYDIRS_GADGET)
  1547.       && (gadgid != MOVE_GADGET)
  1548.       && (gadgid != MOVDEL_GADGET)) CDT1->dt_select = 0;
  1549.       if(RENAME_GADGET == gadgid) break; /*RENAME FIRST FILE ONLY!*/
  1550.       if(COPYALL_GADGET == gadgid)break;/*not based on seleect*/
  1551.       if(FILENOTE_GADGET == gadgid)break;
  1552.       } /*if selected*/
  1553.    CDT1 = CDT1 +1;
  1554.    } /*for all*/
  1555. if((MOVDEL_GADGET == gadgid) ||
  1556.   (MOVE_GADGET == gadgid) ||
  1557.   (COPY_GADGET == gadgid) ||
  1558.   (CPYDIRS_GADGET == gadgid)) new_dir_dest();
  1559.  
  1560. if((ARC_GADGET == gadgid) ||
  1561.   (DEARC_GADGET == gadgid)||
  1562.   (COPYALL_GADGET == gadgid)){
  1563.           getdir_dest();
  1564.           if(DEARC_GADGET==gadgid){
  1565.               status = strcmp(cpdir,curdir);
  1566.               if(status==0)
  1567.                   if(dirflag==0)getdir(curdir);
  1568.                   else getdir(cpdir);
  1569.               }
  1570. }else {
  1571.    temp = *numdir;
  1572.    temp_CDT=CDT;
  1573.    for (i1=0;i1<*numdir;i1++){    
  1574.       if((gadgid == COPY_GADGET)||
  1575.       (gadgid==CPYDIRS_GADGET))temp_CDT->dt_select = 0;
  1576.       if (temp_CDT->dt_select == 2) {
  1577.          strcpy(temp_CDT->dt_fname,"\xff\xff\xff");
  1578.          temp_CDT->dt_select = 0;
  1579.          temp--; 
  1580.  
  1581.       };
  1582.    temp_CDT = temp_CDT +1;
  1583.   }
  1584. if ((*numdir != temp) ||
  1585. (RENAME_GADGET == gadgid) ||
  1586. (GRENAM_GADGET == gadgid)) qsort(CDT,*numdir,(sizeof (struct DT))); 
  1587. *numdir = temp;
  1588. };
  1589.    ptr5 = cpdbuf + strlen(cpdbuf)-1;
  1590. if((gadgid==RENAME_GADGET) || (gadgid ==GRENAM_GADGET)){
  1591.       for (;ptr5 >= cpdbuf;ptr5--) {
  1592.          if (*ptr5 == ':') { 
  1593.             *(ptr5+1) = 0; 
  1594.             break;
  1595.          }
  1596.          if (*ptr5 == '/') { 
  1597.             *ptr5 = 0;
  1598.             break;
  1599.          }
  1600.       }
  1601. }
  1602. *Exe_buf =0;
  1603. if ((RENAME_GADGET == gadgid) ||
  1604. (GRENAM_GADGET == gadgid)){
  1605.               status = strcmp(cpdir,curdir);
  1606.               if(status==0){
  1607.                   if(dirflag==0){sptr = &SDT[0];
  1608.                                  dptr = &DDT[0];
  1609.                   }else{sptr = &DDT[0];
  1610.                         dptr = &SDT[0];}
  1611.                    for (i1=0;i1<*numdir;i1++){    
  1612.                       strcpy(dptr->dt_fname,sptr->dt_fname);
  1613.                       dptr=dptr+1;
  1614.                       sptr=sptr+1;
  1615.                    }
  1616.               }
  1617. if(dirflag==1)dirflag=0;
  1618. else dirflag = 1;
  1619. set_point();
  1620. new_dir(); 
  1621. if(dirflag==1)dirflag=0;
  1622. else dirflag = 1;
  1623. set_point();
  1624. }
  1625.  
  1626.  
  1627. new_dir(); 
  1628.  
  1629. ModifyIDCMP(w,WinIDCMP);
  1630. }
  1631.  
  1632. void par_dir(gadgid) /*Parent and Root*/
  1633.    int gadgid; {
  1634.    char *ptr;       /*With this, we may change curdir*/
  1635.  
  1636.    ModifyIDCMP(w,0);
  1637.    ptr = DIR + strlen(DIR)-1;
  1638.    if((PARENT_GADGET == gadgid) ||(GRENAM_GADGET == gadgid))
  1639.       for (;ptr >= DIR;ptr--) {
  1640.          if (*ptr == ':') { 
  1641.             *(ptr+1) = 0; 
  1642.             break;
  1643.          }
  1644.          if (*ptr == '/') { 
  1645.             *ptr = 0;
  1646.             break;
  1647.          }
  1648.       }
  1649.    else /*Gadget was root. Scan back to :*/
  1650.       for (;ptr >= DIR;ptr--){
  1651.          if (*ptr == ':') {
  1652.             *(ptr+1) = 0;
  1653.             break;
  1654.          }
  1655.       }  
  1656.    getdir(DIR);
  1657.    new_dir();
  1658.    ModifyIDCMP(w,WinIDCMP);
  1659.    return;
  1660. }
  1661. CONV_FILE_NAME()
  1662. {
  1663.  
  1664. int toksiz,ser_key_size,MAX,LENCS,count,LENT,LENS;
  1665. char *PEX,*AST;/*append string*/
  1666. char rep_str[30],ser_str[30];
  1667. int act,len_mat;
  1668. int LENSS,LENRS,LENPRE,LENSUF,LENC;
  1669.  
  1670. char *ptr3,*ptr4,*dirptr,*ptr,*ptr1,*ptr2;
  1671. err = 0;
  1672. ptr4 = &ptr3;
  1673. toksiz = 1;
  1674. LENT = 2;
  1675. ser_key_size = 2;
  1676. PEX = Exe_buf+2;
  1677. dirptr = DIR + strlen(DIR)-1;
  1678. nullterm(CDT1->dt_fname,MAXCD);
  1679. LENS = strlen(CDT1->dt_fname); /*length of name on source string*/
  1680. MAX=29;
  1681. AST = ASTR;
  1682. ptr=Exe_buf+strlen(Exe_buf)-1;
  1683. ptr2=Exe_buf,ptr1=Exe_buf;
  1684. /*find comand strings*/
  1685. for (;ptr >= Exe_buf;ptr--){
  1686.    if(*ptr == '>') ptr2=ptr;
  1687. }
  1688. nullterm(Exe_buf,MAXCD);
  1689. LENCS = strlen(Exe_buf)-2;/*lenght of append string*/
  1690. LENC = LENCS;
  1691. act = strncpy(ASTR,PEX,LENC);/*string to attach*/
  1692. count = stcd_i(ASTR,&LENT);
  1693.          if((*Exe_buf=='+') && (*(Exe_buf+1)==']')){      
  1694.                 if(LENCS<=0)err=1; 
  1695.                 if ((MAX-(LENCS+LENS))<=0)err=1;
  1696.                 else{
  1697.                         strcat(ASTR,CDT1->dt_fname);
  1698.                         if(*dirptr == ':')
  1699.                          sprintf(cpdbuf,"%s%s",DIR,ASTR);
  1700.                       else
  1701.                          sprintf(cpdbuf,"%s/%s",DIR,ASTR);
  1702.                     }
  1703.          }        
  1704.          if((*Exe_buf=='+') && (*(Exe_buf+1)=='[')){      
  1705.                 if(LENCS<=0)err=1; 
  1706.                 if ((MAX-(LENCS+LENS))<=0)err=1;
  1707.                 else{
  1708.                         strcat(CDT1->dt_fname,ASTR);
  1709.                         strcpy(ASTR,CDT1->dt_fname); 
  1710.                         if(*dirptr == ':')
  1711.                          sprintf(cpdbuf,"%s%s",DIR,CDT1->dt_fname);
  1712.                       else
  1713.                          sprintf(cpdbuf,"%s/%s",DIR,CDT1->dt_fname);
  1714.                     }
  1715.          }        
  1716.          if((*Exe_buf=='-') && (*(Exe_buf+1)==']')){      
  1717.                 if(count==0) err=1;
  1718.                 else if(LENT <= 0) err=1;
  1719.                      else if (LENT >= LENS) err=3;
  1720.                           else{ 
  1721.                           ptr = (CDT1->dt_fname) + LENT; 
  1722.                           strcpy(ASTR,ptr);
  1723.                           if(*dirptr == ':')
  1724.                              sprintf(cpdbuf,"%s%s",DIR,ptr);
  1725.                           else
  1726.                              sprintf(cpdbuf,"%s/%s",DIR,ptr);
  1727.                           }
  1728.          }
  1729.          if((*Exe_buf=='-') && (*(Exe_buf+1)=='[')){      
  1730.                 if(count==0) err=1;
  1731.                 else if(LENT <= 0) err=1;
  1732.                      else if (LENT >= LENS) err=3;
  1733.                           else{ 
  1734.                           ptr = (CDT1->dt_fname) ;
  1735.                           ptr1 = ptr + (LENS-LENT);
  1736.                           *ptr1 = 0; 
  1737.                           strcpy(ASTR,ptr);
  1738.                           if(*dirptr == ':')
  1739.                              sprintf(cpdbuf,"%s%s",DIR,ptr);
  1740.                           else
  1741.                              sprintf(cpdbuf,"%s/%s",DIR,ptr);
  1742.                           }
  1743.          }
  1744.          if((*Exe_buf=='#') && (*(Exe_buf+1)=='?')){      
  1745.             LENSS = ptr2 - PEX;
  1746.             LENRS = LENCS - LENSS - 1;
  1747.             if(LENRS <= 0) err=1;
  1748.             if(LENSS <= 0) err=1;
  1749.             if(LENSS >> MAX) err=1;
  1750.             if(LENRS >> MAX) err=1;
  1751.             if((LENS - LENSS + LENRS)>>MAX) err=1;
  1752.             *ptr2 = 0;
  1753.             strcpy(ser_str,"s+");
  1754.             strcpy((ser_str + 2),PEX);
  1755.             strcpy(rep_str,(ptr2 + 1));
  1756.             len_mat = stcpm((CDT1->dt_fname),PEX,ptr4);
  1757.             *ptr2 = '>';
  1758.             if(len_mat == LENSS)
  1759.                  { LENPRE = ptr3 - (CDT1->dt_fname);
  1760.                    LENSUF = LENS - LENPRE - len_mat;
  1761.                    strcpy(ser_str,(CDT1->dt_fname),LENPRE);
  1762.                    strcpy((ser_str+LENPRE),(ptr2+1),LENRS);
  1763.                    strcpy((ser_str+LENPRE+LENRS),(ptr3+LENSS),LENSUF);
  1764.                           strcpy(ASTR,ser_str);
  1765.                           if(*dirptr == ':')
  1766.                              sprintf(cpdbuf,"%s%s",DIR,ser_str);
  1767.                           else
  1768.                              sprintf(cpdbuf,"%s/%s",DIR,ser_str);
  1769.                 }
  1770.          } /* end of replace */
  1771. }   /* end routine */
  1772.  
  1773. /*The following function is used to compare two directory entries*/
  1774. comp(dt1,dt2)
  1775. struct DT *dt1,*dt2;
  1776. {
  1777.    char *ptr1,*ptr2;
  1778.    register c1,c2;
  1779.  
  1780.    for (ptr1=dt1->dt_fname,ptr2=dt2->dt_fname;*ptr1 && *ptr2;ptr1++,ptr2++) {
  1781.       c1 = *ptr1;
  1782.       c2 = *ptr2;
  1783.  
  1784.       c1 &= 0xdf;
  1785.       c2 &= 0xdf;
  1786.  
  1787.       if (c1 > c2) return (-1);
  1788.  
  1789.       if (c1 < c2) return (1);
  1790.    }
  1791.  
  1792.    if (*ptr1) return (-1);
  1793.  
  1794.    return (0);
  1795. }
  1796.  
  1797. void copy(s,pc)
  1798. char *s;
  1799. char *pc;
  1800. {
  1801.    struct FileHandle  *copyin;
  1802.    struct FileHandle  *copyout;
  1803.    int iosize;
  1804.    int actual;
  1805.    char *copybuf;
  1806.    struct FileLock *fl;
  1807.    char *ptr;
  1808.    char *ptr1;
  1809.  
  1810.    if (!(copyin = Open(s,MODE_OLDFILE)))
  1811.       return;
  1812.  
  1813.    if (!*pc) {
  1814.       display_error("No Destination Path Given",0);
  1815.       return;
  1816.    }
  1817.  
  1818.    if ((fl = Lock(pc,ACCESS_READ))) {
  1819.       UnLock(fl);
  1820.       ptr = strlen(pc) + pc - 1;
  1821.       for (ptr1=s+strlen(s)-1;ptr1 > s;ptr1--) {
  1822.          if (*ptr1 == '/' || *ptr1 == ':')
  1823.             break;
  1824.       }
  1825.       if (*ptr1 == '/' || *ptr1 == ':')
  1826.          ptr1++;
  1827.       if (*ptr == ':')
  1828.          sprintf(command,"%s%s",pc,ptr1);
  1829.       else
  1830.        sprintf(command,"%s/%s",pc,ptr1);
  1831.    } else {
  1832.       display_error("Illegal Destination Path ",IoErr());
  1833.       Close(copyin);
  1834.       return;
  1835.    }
  1836.  
  1837.    if (!strcmp(command,s)) {
  1838.       display_error("Cannot Copy File to Itself",0);
  1839.       Close(copyin);
  1840.       return;
  1841.    }
  1842.  
  1843.    if (!(copyout = Open(command,MODE_NEWFILE))) {
  1844.       display_error("Cannot Write to Requested Path ",IoErr());
  1845.       Close(copyin);
  1846.       return;
  1847.    } else {
  1848.       /*Determine the length of the file*/
  1849.       iosize = Seek(copyin,0,OFFSET_BEGINING);
  1850.       iosize = 12288;
  1851.       /*Allocate memory for the copy buffer*/
  1852.       do {
  1853.          copybuf = AllocMem(iosize,MEMF_PUBLIC);
  1854.          if (copybuf == 0)
  1855.             iosize = iosize/2;
  1856.       } while (copybuf == 0 & iosize > 512);
  1857.  
  1858.       /*Copy the file*/
  1859.       do {
  1860.          actual = Read(copyin,copybuf,iosize);
  1861.          if (Write(copyout,copybuf,actual) != actual)
  1862.             break;
  1863.       } while (actual == iosize);
  1864.  
  1865.       /*Free the copy buffer*/
  1866.       FreeMem(copybuf,iosize);
  1867.  
  1868.       /*Close the input and output buffers*/
  1869.       Close(copyout);
  1870.       Close(copyin);
  1871.    }
  1872. }
  1873.  
  1874. nullterm(str,len) /*End a string with a null*/
  1875. char *str;
  1876. int len;
  1877. {
  1878.    register i;
  1879.  
  1880.    str[len] = 0; 
  1881.    for (i=len;len >= 0;len--) {
  1882.       if (str[i] != ' ' && str[i])
  1883.          break;
  1884.       str[i] = 0;
  1885.    }
  1886. }
  1887.  
  1888. display_error(errormsg,doserrnum)
  1889. char *errormsg;
  1890. long doserrnum;
  1891. {
  1892.    strcpy(err_buf,errormsg);
  1893.     if (doserrnum) sprintf(err_buf,"%s (DOS Error %d)",err_buf,doserrnum);
  1894.    err_str.NumChars = strlen(err_buf);
  1895.    err_str.BufferPos = strlen(err_buf);
  1896.    RefreshGadgets(&Err_gad,w,NULL);
  1897. }
  1898.  
  1899. close_things()
  1900. {
  1901.    if(RSHOWLOCK ) UnLock(RSHOWLOCK);
  1902.    if(ARCLOCK ) UnLock(ARCLOCK); 
  1903.    if(ELOCK ) UnLock(ELOCK); 
  1904.    if(CDLOCK ) UnLock(CDLOCK);
  1905.    if(COPYLOCK ) UnLock(COPYLOCK);
  1906.    if(RRUNLOCK ) UnLock(RRUNLOCK);
  1907.    if(RDISKCOPYLOCK ) UnLock(RDISKCOPYLOCK);
  1908.    if(RFORMATLOCK ) UnLock(RFORMATLOCK);
  1909.    if(REXECUTELOCK ) UnLock(REXECUTELOCK);
  1910.    if(DELETELOCK ) UnLock(DELETELOCK);
  1911.    if(PLAYERLOCK ) UnLock(PLAYERLOCK);
  1912.    if(LIBCLOCK ) {UnLock(LIBCLOCK);
  1913.    sprintf(command,"%s","Assign libs: sys:libs");
  1914.    Execute(command,0,0);};
  1915.    if(ASSIGNLOCK ) {UnLock(ASSIGNLOCK);
  1916.    sprintf(command,"%s","sys:c/Assign c: sys:c");
  1917.    Execute(command,0,0);};
  1918.    sprintf(command,"%s","sys:c/Delete ram:libs all quiet");
  1919.    Execute(command,0,0);
  1920.    sprintf(command,"%s","sys:c/Delete ram:DUC all quiet");
  1921.    Execute(command,0,0);
  1922.    sprintf(command,"%s","sys:c/Delete ram:CRT");
  1923.    Execute(command,0,0);
  1924.    if (w) CloseWindow(w);
  1925.  
  1926.    if (GfxBase) CloseLibrary(GfxBase);
  1927.  
  1928.    if (IntuitionBase) CloseLibrary(IntuitionBase);
  1929.  
  1930.    if (InitialCurrentDirLock) {
  1931.       CurrentDir(InitialCurrentDirLock);
  1932.       UnLock(CurrentDirLock);
  1933.  }
  1934. }
  1935.  
  1936. qsort( v, n, size)
  1937. char *v;
  1938. short n;
  1939. int size;
  1940. {
  1941.    short gap, i, j;
  1942.    register x;
  1943.    char temp, *p1, *p2;
  1944.    for (gap=n/2;gap > 0; gap /= 2)
  1945.       for (i=gap; i<n; i++)
  1946.          for (j = i-gap; j >= 0; j -= gap)
  1947.             if ( comp((p1=v+j*size), (p2=v+(j+gap)*size)) < 0) {  
  1948.                /*exchange them*/
  1949.                for (x=0; x<size; x++) {
  1950.                   temp = *p1;
  1951.                   *p1++ = *p2;
  1952.                   *p2++ = temp;
  1953.                }
  1954.             }
  1955. }
  1956.  
  1957. void Print_to_screen(ptr)
  1958. char *ptr[];
  1959. {
  1960.  
  1961. register i, len, len2; 
  1962.  
  1963. MyOpen(ptr);
  1964. DoHeader(); 
  1965. if (!done)
  1966.    do{
  1967.       len = Read(workfp,buf,512);
  1968.       len2 = 0;
  1969.       while (len2<len && done == FALSE){
  1970.          for (i=0; buf[len2+i] != 0x0a && i<78 && i+len2<511; i++)
  1971.          if (buf[len2+i] == 0x0c) buf[len2+i] = 0x20;         
  1972.          Write(window,&buf[len2],i+1);
  1973.          len2 += i + 1;
  1974.          if (++linecount > 20 && buf[len2-1] == 0x0a) WaitSpace();
  1975.       }
  1976.    }while(len == 512 && done == FALSE);
  1977.         MyDone();
  1978.    MyClose();
  1979.    return;
  1980. }
  1981.  
  1982. void Print_to_printer(ptr)
  1983. char *ptr[];
  1984. {
  1985.  
  1986. register len; 
  1987. done = FALSE; /*boolean variables*/
  1988.  
  1989.    workfp = Open(ptr,MODE_OLDFILE); /*Try to open the file to print*/
  1990.    if(workfp == NULL) done = TRUE;
  1991.    else {
  1992.       window = Open("prt:",MODE_NEWFILE);
  1993.       if(window == NULL) done = TRUE;
  1994.    }
  1995.    if (!done)
  1996.       do{
  1997.          len = Read(workfp,buf,512);
  1998.          Write(window,&buf[0],len);
  1999.       }while(len == 512);
  2000.  
  2001.    MyClose();
  2002.    return;
  2003. }
  2004. void Hprint_to_screen(ptr)
  2005. char *ptr[];
  2006. {
  2007.  
  2008. register len;
  2009. char r1[2];
  2010. MyOpen(ptr);
  2011. DoHeader();
  2012. if (!done)
  2013. strcpy(buffer,"    -                                     ");
  2014. r1[0]=0x00;r1[1]=0x00;
  2015.    do{
  2016.       index = 0;
  2017.       DoHex(r1,2);
  2018.       r1[1] += 16;
  2019.       if (!(r1[1])) r1[0]++;
  2020.       index = 6;
  2021.       len = Read(workfp,buf,16);
  2022.       buf[len]=0x0a;
  2023.       DoHex(buf,len,6);
  2024.       if (len) {
  2025.          Write(window,&buffer[0],index);
  2026.          if (len != 16) Write(window,&blank[0],42-index);
  2027.          Write(window,&buf[0],len+1);
  2028.       };
  2029.       if (++linecount > 21) WaitSpace();
  2030.    }while ((len == 16) && (done == FALSE));
  2031.    MyDone();
  2032.    MyClose();
  2033.    return;
  2034. }
  2035.  
  2036. void DoHex(ptr2,len)
  2037. int len;
  2038. char ptr2[];
  2039. {
  2040. unsigned char c1,c2;
  2041. unsigned int i,i2=0;
  2042. for (i=0;i<len;i++) {
  2043.    c1 = ((ptr2[i] & 0xf0) >>4);
  2044.    c2 = (ptr2[i] & 0x0f);
  2045.       if (c1 > 9) c1 += 87;
  2046.           else c1 += 48;
  2047.       if (c2 > 9) c2 += 87;
  2048.           else c2 += 48; 
  2049.    buffer[index]=c1;
  2050.    buffer[index+1]=c2;
  2051.    if((buf[i] < 32) || (buf[i] > 127)) buf[i]=46;
  2052.    index += 2;
  2053.    if (++i2 == 4) {
  2054.          index++;
  2055.          i2=0;
  2056.    };
  2057. }
  2058. }
  2059.  
  2060. void MyOpen(ptr)
  2061. char *ptr[];
  2062. done = FALSE;
  2063. linecount = 1;
  2064. workfp = Open(ptr,MODE_OLDFILE);
  2065. if(workfp == NULL) done = TRUE;
  2066. else{
  2067.    strcpy(command,"raw:0/0/640/200/Listing of: ");
  2068.    strcat(command,ptr);
  2069.    window = Open(command,MODE_NEWFILE);
  2070.    if(window == NULL) done = TRUE;
  2071. }
  2072. }
  2073.  
  2074. void DoHeader()
  2075. {
  2076. strcpy(command,"\x1b[33m<CR>\x1b[2m advances one line, \x1b[33mSpace Bar\x1b[2m");
  2077. Write(window,command,strlen(command));
  2078. strcpy(command," advances one page, and \x1b[33mESC\x1b[2m aborts.\n\x1b[0m");
  2079. Write(window,command,strlen(command));
  2080. }
  2081.  
  2082. void WaitSpace()
  2083. {
  2084. unsigned char c;
  2085.  
  2086.    linecount = 1;
  2087.    /*print the messages in color 3*/
  2088.    strcpy(command,"\x1b[33mPress SPACE for more...\x1b[0m");
  2089.    Write(window,command,strlen(command));
  2090.    /*wait for a key*/
  2091.    while(Read(window,&c,1),c != ' ') {
  2092.       if (c == ESC){
  2093.       done = TRUE; /*short circuit*/
  2094.       break;
  2095.       }
  2096.       /*RETURN scrolls by one line*/
  2097.       else if (c == '\r'){
  2098.          linecount = 20;
  2099.          break;
  2100.          }
  2101.    }
  2102. /*erase the message*/
  2103. strcpy(command, "\r                        \r");
  2104. Write(window,command,strlen(command));
  2105. }
  2106.  
  2107. void MyDone()
  2108. {
  2109. unsigned char c;
  2110.    strcpy(command,"\r\x1b[33mEnd of File.  Press SPACE\x1b[0m");
  2111.    Write(window,command,strlen(command));
  2112.    /*Wait for spacebar to quit*/
  2113.    while(Read(window,&c,1),c != ' ');
  2114. }
  2115. void MyClose()
  2116. {
  2117.    if(workfp) Close(workfp);
  2118.    if(window) Close(window);
  2119. }
  2120.